﻿using System;
using System.Collections;
using System.Data.Objects.DataClasses;
using System.Web.UI;
using System.Web.UI.WebControls;
using PortalCurriculo.Domain.Utils;
using PortalCurriculo.WebUI.Helpers;
using PortalCurriculo.WebUI.UserControls.Curriculo.Cadastro;

namespace PortalCurriculo.WebUI.UserControls.Basico
{
    public partial class Tela : Curriculo.Curriculo
    {
        #region Propriedade Públicas

        public bool Adicionar = true;
        public bool Editar = true;
        public bool Excluir = true;
        public IList Entidades { private get; set; }
        public EntityObject Entidade { private get; set; }
        public Type TipoUserControlVisualizacao { get; set; }
        public Type TipoUserControlCadastro { get; set; }
        public string ValidationGroup { get; set; }
        public string Titulo { get; set; }
        public string TituloPopup { get; set; }
        public object ObjetoVariavel { get; set; }
        public Domain.Curriculo Curriculo { get; set; }

        #endregion

        private Curriculo.Curriculo UserControlCadastro { get; set; }

        #region Métodos

        private string ObterCaminhoUserControl(string fullName)
        {
            return string.Concat(fullName.Replace("PortalCurriculo.WebUI", "~").Replace(".", "/"), ".ascx");
        }

        private Curriculo.Curriculo CriarControleVisualizacao(object entidade, out Type tipoEntidade)
        {
            var control =
                (Curriculo.Curriculo) Page.LoadControl(ObterCaminhoUserControl(TipoUserControlVisualizacao.FullName));
            tipoEntidade = entidade.GetType();

            control.Entidade = entidade;
            control.IdUsuario = IdUsuario;
            return control;
        }

        private void PreencherListView()
        {
            if (Entidades == null && Entidade == null && IdUsuario != UsuarioLogado.Id)
            {
                Visible = false;
                return;
            }

            if (Entidades != null)
            {
                ListView.DataSource = Entidades;
                ListView.DataBind();
            }
            else if (Entidade != null)
            {
                divRepeticao.Controls.Clear();
                divRepeticao.Controls.Add(divBotoes);

                Type tipoEntidade;
                var control = CriarControleVisualizacao(Entidade, out tipoEntidade);
                divRepeticao.Controls.Add(control);
                ConfigurarDivRepeticao(divRepeticao, divBotoes);
                ConfigurarBotoes(divBotoes, imbEditar,
                                 tipoEntidade.GetProperty("Id").GetValue(Entidade, null).ToString(), imbExcluir, Editar,
                                 Excluir);
            }
        }

        private void AtualizarCurriculo()
        {
            if (Curriculo == null) return;

            Curriculo.DataUltimaAtualizacao = DateTime.Now;
            Curriculo.Save();
        }

        #endregion

        #region Eventos

        protected void Page_Load(object sender, EventArgs e)
        {
            UserControlCadastro =
                (Curriculo.Curriculo) Page.LoadControl(ObterCaminhoUserControl(TipoUserControlCadastro.FullName));

            var tipo = UserControlCadastro.GetType();
            tipo.GetProperty("ValidationGroup").SetValue(UserControlCadastro, ValidationGroup, null);
            if (Entidades != null)
                tipo.GetProperty("Entidades").SetValue(UserControlCadastro, Entidades, null);
            else if (Entidade != null)
                tipo.GetProperty("EntidadeSimples").SetValue(UserControlCadastro, Entidade, null);

            UserControlCadastro.IdUsuario = IdUsuario;
            UserControlCadastro.IdCurriculo = IdCurriculo;
            divFormulario.Controls.Add(UserControlCadastro);

            imbAdicionar.Visible = lnkAdicionar.Visible = Adicionar && IdUsuario == UsuarioLogado.Id;
            btnSalvar.ValidationGroup = ValidationGroup;
            lblTitulo.Text =  Titulo;
            lblTituloPopup.Text = string.IsNullOrEmpty(TituloPopup) ? Titulo : TituloPopup;

            //if (IsPostBack) return;
            PreencherListView();
            if (Curriculo == null && IdCurriculo != 0)
                Curriculo = new Domain.Curriculo().SelectById<Domain.Curriculo>(IdCurriculo);
        }

        protected void ListView_ItemDataBound(object sender, ListViewItemEventArgs e)
        {
            var item = (ListViewDataItem) e.Item;
            var entidade = item.DataItem;
            Type tipoEntidade;
            var control = CriarControleVisualizacao(entidade, out tipoEntidade);

            item.FindControl("divRepeticao").Controls.Add(control);
            ConfigurarBotoes(item, tipoEntidade.GetProperty("Id").GetValue(entidade, null).ToString(), Editar, Excluir);
        }

        protected void imbExcluir_Click(object sender, ImageClickEventArgs e)
        {
            var id = int.Parse(((System.Web.UI.WebControls.ImageButton) sender).CommandArgument);

            UserControlCadastro.IdEntidade = id;

            if (Entidades == null) return;

            foreach (var entidade in Entidades)
            {
                if (!entidade.GetType().GetProperty("Id").GetValue(entidade, null).ToString().Equals(id.ToString()))
                    continue;

                Entidades.Remove(entidade);

                new GeneralAction((EntityObject) entidade).Delete();
                PreencherListView();
                break;
            }

            AtualizarCurriculo();
        }

        protected void imbEditar_Click(object sender, ImageClickEventArgs e)
        {
            var id = int.Parse(((System.Web.UI.WebControls.ImageButton) sender).CommandArgument);
            LimparCampos();
            UserControlCadastro.IdEntidade = id;
            var curriculo = ((ICurriculo) UserControlCadastro);
            curriculo.Editar();
            Popup.Show();
        }

        protected void lnkCancelar_Click(object sender, EventArgs e)
        {
            LimparCampos();
            Popup.Close();
            Popup.Close();
        }

        protected void lnkSalvar_Click(object sender, EventArgs e)
        {
            try
            {
                ((ICurriculo) UserControlCadastro).Salvar();
                Popup.Close();
                PreencherListView();
                AtualizarCurriculo();
            }
            catch (AlreadyExistsException exception)
            {
                Popup.Show();
                WebHelper.ShowMessageBox(exception.Message, ref UpdatePanel);
            }
        }

        protected void lnkAdicionar_Click(object sender, EventArgs e)
        {
            LimparCampos();
            Popup.Show();
        }

        private void LimparCampos()
        {
            UserControlCadastro.IdEntidade = 0;
            ((ICurriculo) UserControlCadastro).LimparCampos();
        }

        #endregion
    }
}